///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*	Contains code for line-swept spheres.
*	\file		LaborLSS.h
*	\author		Pierre Terdiman
*	\date		April, 4, 2000
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Include Guard
#ifndef __LaborLSS_H__
#define __LaborLSS_H__
#include "../LaborCoreDef.h"
NAMESPACE_LABOR3D_BEGIN
class  LABORCORE_API CLLSS : public CLSegment
{
public:
	//! Constructor
	inline			CLLSS()																	{}
	//! Constructor
	inline			CLLSS(const CLSegment& seg, float radius) : CLSegment(seg), mRadius(radius)	{}
	//! Destructor
	inline			~CLLSS()																	{}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	*	Computes an OBB surrounding the LSS.
	*	\param		box		[out] the OBB
	*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	void	computeOBB(CLOBB& box);

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	*	Tests if a point is contained within the LSS.
	*	\param		pt	[in] the point to test
	*	\return		true if inside the LSS
	*	\warning	point and LSS must be in same space
	*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	inline	bool	contains(const CLPoint3& pt)	const	{ return squareDistance(pt) <= mRadius*mRadius;	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	*	Tests if a sphere is contained within the LSS.
	*	\param		sphere	[in] the sphere to test
	*	\return		true if inside the LSS
	*	\warning	sphere and LSS must be in same space
	*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	inline	bool	contains(const CLSphere& sphere)
	{
		float d = mRadius - sphere.mRadius;
		if(d>=0.0f)	return squareDistance(sphere.mCenter) <= d*d;
		else		return false;
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	*	Tests if an LSS is contained within the LSS.
	*	\param		lss		[in] the LSS to test
	*	\return		true if inside the LSS
	*	\warning	both LSS must be in same space
	*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	inline	bool	contains(const CLLSS& lss)
	{
		// We check the LSS contains the two spheres at the start and end of the sweep
		return contains(CLSphere(lss.mP0, lss.mRadius)) && contains(CLSphere(lss.mP0, lss.mRadius));
	}

	float	mRadius;	//!< CLSphere radius
};

NAMESPACE_LABOR3D_END

#endif // __LaborLSS_H__
